﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

using DATLib;
using DimsMapper.Modules;
using DimsMapper.UIClasses;

namespace DimsMapper
{
    internal static class Main
    {
        public enum ShowTypes : int
        {
            Item,
            Critter,
            Scenery,
            Walls,
            Tiles,
            Misc,
            RoofTiles = 6,
            HexGrid   = 7,
            HexBlock  = 8,

            // 
            HexGridObj    = 17, // занятый
            HexBlockThru  = 18, // простреливаемый или 
        }

        internal static int selectMode;
        internal static bool showOnTopBlockers;

        private static List<DataBase> dataBases;
        private static int mapOpenCount;

        public static void InitializeMapper()
        {
            dataBases = new List<DataBase>();
            
            // читаем файл конфигурации
            Settings.SaveDataFolder = INIConfig.GetConfigString("Path", "SaveDataPath");
            Settings.SetFalloutCfgFile(INIConfig.GetConfigString("Path", "CommonPath"));

            if (Settings.FalloutCfgFile() != string.Empty && File.Exists(Settings.FalloutCfgFile())) {
                InitializeDataBases();

                if (Settings.SaveDataFolder == string.Empty) {
                    Settings.SaveDataFolder = Path.Combine(Settings.MainGamePath(), INIConfig.GetString("system", "master_patches", Settings.FalloutCfgFile(), "data"));
                }
            }
        }

        public static void InitializeDataBases()
        {
            Settings.SetMainGamePath(Path.GetDirectoryName(Settings.FalloutCfgFile()));

            Settings.LanguageFolder = INIConfig.GetString("system", "language", Settings.FalloutCfgFile(), "english");

            dataBases.Clear();
            dataBases.Add(new DataBase(INIConfig.GetString("system", "master_dat", Settings.FalloutCfgFile(), "master.dat"), Settings.MainGamePath()));
            dataBases.Add(new DataBase(INIConfig.GetString("system", "critter_dat", Settings.FalloutCfgFile(), "critter.dat"), Settings.MainGamePath()));

            //pathxxx.dat


            // добавить в самом конце после всех патчей
            string master_patches = INIConfig.GetString("system", "master_patches", Settings.FalloutCfgFile(), "data");
            string critter_patches = INIConfig.GetString("system", "critter_patches", Settings.FalloutCfgFile(), "data");

            dataBases.Add(new DataBase(master_patches, Settings.MainGamePath(), true));
            if (!master_patches.Equals(critter_patches, StringComparison.OrdinalIgnoreCase)) {
                dataBases.Add(new DataBase(critter_patches, Settings.MainGamePath(), true));
            }

            // Открываем имеющиеся master.dat/critter.dat файлы
            string error;
            foreach (var item in dataBases)
            {
                if (item.IsDat) {
                    DATManage.OpenDatFile(item.DataBasePath, out error);
                } 
            }
        }

        public static void ResetInitialize()
        {
            if (!LstFiles.IsInitilization()) return;

            LstFiles.ClearAll();
            ProtoFiles.Clear();
            FrmFiles.Clear();
            MsgFiles.Clear();
        }

        public static List<DataBase> DataBases()
        {
            return dataBases;
        }

        public static void CloseAllDataBases()
        {
            DATManage.CloseAllDatFiles();
        }

        public static int MapsOpenCount()
        {
            return mapOpenCount;
        }

        public static void SetMapsOpenCount(int value)
        {
            mapOpenCount = value;
        }

        public static List<string> OpenMapsList()
        {
            return DatFiles.FindAllFilesByExt("MAPS\\", ".map");
        }

        public static MapTab LoadMap(string name)
        {
            // Возвращает поток к данным файла карты
            DBFile file = DatFiles.OpenFile("MAPS\\" + name);
            if (file == null) return null;

            // инициализируем 
            int result = LstFiles.InitilizationLst();

            ProgressForm progress = new ProgressForm("Загрузка данных карты...", 10);
            progress.Show(MainForm.ActiveForm);

            // Создаем объект карты
            Map mapData = new Map(file);
            
            progress.SetProgressText("Загрузка объектов карты...", mapData.Objects.TotalObjects());

            mapData.Objects.LoadObjects(file, mapData.MapVersion, progress);

            // загрузить FRM
            progress.SetProgressText("Загрузка FRM изображений...", (mapData.TilesCount / 10) + mapData.Objects.ProtoLocalTotalCount());

            for (int i = 0; i < mapData.TilesCount; i++)
            {
                int floorFid = mapData.Tiles.GetFloorID(i) & 0x3FFF;
                FrmFiles.LoadTileFRM(floorFid);

                mapData.Objects.SetProtoLocal(Object.Types.Tiles, floorFid);

                int roofFid = mapData.Tiles.GetRoofID(i) & 0x3FFF;
                FrmFiles.LoadTileFRM(roofFid);

                mapData.Objects.SetProtoLocal(Object.Types.Tiles, roofFid);

                progress.ProgressStepTile();
            }

            for (int i = 0; i < 6; i++)
            {
                if (i == 4) continue;

                int count = mapData.Objects.ProtoLocal((Object.Types)i).Length;
                for (int n = 1; n < count; n++)
                {
                    if (mapData.Objects.ProtoLocal((Object.Types)i)[n] == 1) {
                        var proto = ProtoFiles.GetProto((Object.Types)i, n);

                        int fid = proto.common.FID;
                        if (fid != -1) FrmFiles.LoadFRM(fid);

                        progress.ProgressStep();
                    }
                }
            }
            progress.Close();

            MapTab map = new MapTab(mapData, file.ToString());
            file.Close();

            return map;
        }

    }
}
